package lincen.javase.util.collections.queue;

import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.Queue;

/**
 * 长度被限制的队列, 该队列一旦超过最大限制, 那么就会自动移除第一个元素
 * @author 	林岑
 * @time	2012年9月26日 11:34:09
 */
public class RestrictQueue<V> implements Iterable<V>{
	
	/**
	 * 记录队列
	 */
	private Queue<V> queue = new ArrayDeque<V>();
	
	/**
	 * 最大记录数量
	 */
	public final int maxCount;
	
	/**
	 * 新建一个记录队列, 并初始化一个最大记录数
	 * @param maxCount
	 */
	public RestrictQueue(int maxCount) {
		this.maxCount = maxCount;
	}

	/**
	 * 追加一条记录, 如果已经达到了最大记录数, 那么就会自动删除最前面一条记录
	 * @param value
	 */
	public void append(V value) {
		queue.offer(value);
		while(queue.size() > maxCount) {
			queue.poll();
		}
	}

	@Override
	public Iterator<V> iterator() {
		return queue.iterator();
	}

	/**
	 * 将该容器转换为列表
	 * @return
	 */
	public List<V> toList() {
		ArrayList<V> l = new ArrayList<V>(queue);
		Collections.reverse(l);
		return l;
	}
}
